package com.controller;

import com.context.AppContext;
import com.model.domain.proceso.envio.subida.LogXmlTransferido;
import com.model.domain.usuario.EstadoUsuario;
import com.model.domain.usuario.PerfilEnum;
import com.model.domain.usuario.Usuario;
import util.log.MiLogger;
import com.model.service.AbstractDataXmlService;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import util.www.jsp.JspUtil;
import util.file.Archivo;
import util.file.OperacionSubida;

public abstract class AbstractDataXmlController 
extends AbstractController
{
    private UsuarioController usuarioController;
    //private AbstractDataXmlService service;

    public void upload(HttpServletRequest request, HttpServletResponse response) throws Exception { 
        MiLogger logger = MiLogger.getLogger(response,AppContext.getInstancia().getLoggerContext().getLoggerErrores());
        proceso1_subirDataXml(logger,request,response);
    }
    
    public void upload_cargar(HttpServletRequest request, HttpServletResponse response) throws Exception {        
        MiLogger logger = MiLogger.getLogger(response,AppContext.getInstancia().getLoggerContext().getLoggerErrores());
        
        //subiendo archivos
        List<LogXmlTransferido> lista = proceso1_subirDataXml(logger,request,response);
        
        //cargandolos
        proceso2_cargarDataXml(logger, request,response, lista, true);//con restricciones
    }
     
    public void menuSubirXml(HttpServletRequest request, HttpServletResponse response) throws Exception {
        request.setAttribute("diagnostics", this.testEnvironment());
        //request.getRequestDispatcher("/cargardataxml.jsp").forward(request, response);
    }

    public String testEnvironment() {
        //throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
        return "";
    }
    
    //protected final List<Archivo> proceso1_subirDataXml(HttpServletRequest request, HttpServletResponse response) throws Exception {         
    protected final List<LogXmlTransferido> proceso1_subirDataXml(MiLogger logger, HttpServletRequest request, HttpServletResponse response) throws Exception {
        List<LogXmlTransferido> lista = new ArrayList<LogXmlTransferido>();
        
        Usuario uServidor = usuarioController.getUsuarioEnSesionDelServidor(request);
        PerfilEnum p = uServidor.getPerfil().getEnum();
        EstadoUsuario estado = uServidor.getEstado();
                
        //MiLogger logger = MiLogger.getLogger(response);
                   
        //Solo se envia si estado del cliente es inactivo
        if(p==PerfilEnum.ADMINISTRADOR_SISTEMA || estado==EstadoUsuario.SIN_ACTIVIDAD) {             

            try { 
                uServidor.setEstado(EstadoUsuario.SUBIENDO_XML);                
                String user = uServidor.getIdentificador();                          

                //--------------------------------------------------------------------
                //PROCESO 1: Subiendo archivos XML en directorio del servidor
                //--------------------------------------------------------------------
                this.getService().transferirDataXML(request, lista, logger, user, JspUtil.getDireccionIPCliente(request));
                
                if(!lista.isEmpty()) {                    
                    for(LogXmlTransferido logxml : lista) {
                        OperacionSubida op = logxml.getOperacionSubida();
                        
                        StringBuilder saveFiles = new StringBuilder();
                        if(logxml.isSubido())
                            saveFiles.append("<B>Archivo fue transferido satisfactoriamente:</B> ");
                        else
                            saveFiles.append("<B>Archivo NO fue transferido:</B> ");
                        
                        Archivo a = op.getArchivo();
                        saveFiles.append(a.getNombre() + " ("+ a.getTamanho() +"B) " );                        
                        
                        logger.log(saveFiles.toString());
                    }
                }
                else {
                    logger.log("No file selected for upload or the file name specified in the upload form does not correspond to a valid file in the system.");
                }                
            }                                  
            finally {
                uServidor.setEstado(EstadoUsuario.SIN_ACTIVIDAD);
            }

        }
        else {  
            //saveFiles.append("ELSE");
            mostrarMensajeAUsuarioActivo(logger, estado);
        }        
            
        //response.getWriter().append(saveFiles);        
        return lista;
    }  
    
    //CARGA MANUAL
    protected final void proceso2_cargarDataXml(MiLogger logger, HttpServletRequest request, HttpServletResponse response, 
            List<LogXmlTransferido> listaLog, boolean cargarConControl) throws Exception {  
        
        Usuario uServidor = usuarioController.getUsuarioEnSesionDelServidor(request);
        PerfilEnum p = uServidor.getPerfil().getEnum();
        //SesionEnaho sesion = new SesionEnaho(request);
        //EstadoUsuario estado = sesion.getEstado();
        EstadoUsuario estado = uServidor.getEstado();
                
        StringBuilder saveFiles = new StringBuilder();
        
        //System.out.println("CARGANDO ...");
        //MiLogger logger = MiLogger.getLogger(response);
        
        //Solo se envia si estado del cliente es inactivo
        if(p==PerfilEnum.ADMINISTRADOR_SISTEMA || estado==EstadoUsuario.SIN_ACTIVIDAD) {    
            
            try { 
                uServidor.setEstado(EstadoUsuario.CARGANDO_XML);         
               
                //--------------------------------------------------------------------
                //PROCESO 2: Cargando archivos XML en BD SQL
                //--------------------------------------------------------------------                                   
                
                this.getService().cargarDataXML_ManualMenu(logger, listaLog, cargarConControl,uServidor.getIdentificador());                    
            }                                  
            finally {
                uServidor.setEstado(EstadoUsuario.SIN_ACTIVIDAD);
            }

        }
        else {  
            //System.out.println("ESPERE");
            
            //saveFiles.append("ELSE");
            mostrarMensajeAUsuarioActivo(logger, estado);
        }        
            
        //return saveFiles.toString();
        response.getWriter().append(saveFiles);
    }
    
    private void mostrarMensajeAUsuarioActivo(MiLogger logger, EstadoUsuario estado) {
        if(estado==EstadoUsuario.SUBIENDO_XML) {
            logger.log("Actualmente se está subiendo un archivo al Sistema. Espere a que termine esta operación.");
        }
        if(estado==EstadoUsuario.CARGANDO_XML) {                
            logger.log("Actualmente se está CARGANDO un archivo a la BD. Espere a que termine esta operación.");
        }
    }
 
    @Override
    public AbstractDataXmlService getService() {
        return (AbstractDataXmlService) super.getService();
    }

    public UsuarioController getUsuarioController() {
        return usuarioController;
    }

    public void setUsuarioController(UsuarioController usuarioController) {
        this.usuarioController = usuarioController;
    }


}

